package de.nonspectare.bean;

import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

import de.nonspectare.exception.PropertyNotFoundException;
import de.nonspectare.model.*;

//Bean merkt sich ihren Zustand nicht.
public class DemoFactory {

	private static final String PERSISTENCE_UNIT_NAME = "SelectionEngineDatabaseH2Server";
	private static EntityManagerFactory factory;
	private static EntityManager em;

	private static final Logger logger = Logger.getLogger("Logging");

	public DemoFactory() {
		factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
		em = factory.createEntityManager();
	}

	public void saveWebservice(Webservice ws) {
		// Erstemal abfrage, ob der EntityManager richtig erstellt wurde
		if (null != em) {
			// Wenn der EntityManager richtig erstellt wurde, dann soll er
			// gespeichert werden.
			em.persist(ws);

			System.out.println("WebService wurde erstellt!!!");
		} else {
			System.out
					.println("Konnte EntityManager nicht richtig erstellen!!!");
		}
	}

	public void saveQuality(Quality q) {

		// Erstemal abfrage, ob der EntityManager richtig erstellt wurde
		if (null != em) {
			// Wenn der EntityManager richtig erstellt wurde, dann soll er
			// gespeichert werden.
			em.persist(q);

			System.out.println("WebService wurde erstellt!!!");
		} else {
			System.out
					.println("Konnte EntityManager nicht richtig erstellen!!!");
		}
	}

	// alle WebServices Ausgeben
	public List<Webservice> getAllWebServices() {
		if (null == em) {
			System.out.println("Warnung!! Em ist null!!!");
			return null;
		} else {
			// TypedQuery<Webservice> query =
			// em.createQuery("select c from webservice c", Webservice.class);
			// return query.getResultList();
			return null;
		}
	}

	public void saveBpelFile(BPELFile bpel) {
		// Erstemal abfrage, ob der EntityManager richtig erstellt wurde
		if (null != em) {
			// Wenn der EntityManager richtig erstellt wurde, dann soll er
			// gespeichert werden.
			em.persist(bpel);

			System.out.println("BPELFile wurde erstellt!!!");
		} else {
			System.out
					.println("Konnte EntityManager nicht richtig erstellen!!!");
		}
	}

	public void setProperty(String name, String value) {

		em.persist(new SelectionEngineProperties(name, value));
	}

	public String getProperty(String name) {

		Object value = em.find(SelectionEngineProperties.class, name)
				.getValue();

		if (value == null) {
			return null;
		}

		return value.toString();
	}

	public BPELFile getBPELFileByName(String name) {

		Query q = em.createQuery("SELECT b FROM BPELFile b WHERE b.fileName = :name");
		q.setParameter("name", name);
		
		
		if (q.getResultList().size() == 0) {
			System.out.println("Nichts gefunden");
			return null;
		}		
		return (BPELFile) q.getResultList().get(0);
	}

	public BPELFile getBPELFileByID(int id) throws PropertyNotFoundException {

		BPELFile value = (BPELFile) em.find(BPELFile.class, (long) id);

		if (value == null) {
			throw new PropertyNotFoundException(
					"BPELFile ist in der Datenbank nicht vorhanden!");
		}

		logger.log(Level.INFO, value.getFileName());
		return value;
	}
}
